#include "usrope.h"
#include "admin.h"
#include "worker.h"
#include "player.h"
#include <stdio.h>

//用户登录选择界面
int logOrRegFace()
{
    while(1)
    {
        system("clear");
        system("fortune-zh | cowsay");
        //system("cmatrix");
        //system("^C");
        //system("欢迎购买绝不亏本彩票 | cowsay");
        //sleep(2);
        //qingping;
        printf("\033[1m\033[45;33m 欢迎购买绝不亏本彩票 \033[0m\n");
        printf("1.登录\n");
        printf("2.注册\n");
        printf("0.退出\n");
        int cNum = 9;
        if(1 != scanf("%d",&cNum))
        {
            chidaodi;
        }
        else
        {
            getchar();
        }
        if(cNum!=1 && cNum!=2 &&cNum!=0)
        {
            printf("选择错误！两秒后请重新选择!\n");
            sleep(2);
            continue;
        }
        return cNum;
    }
}

//键盘输入字符串
void getSTR(char *ch,int len)
{
    if(NULL==ch || 0>=len)
    {
        return;
    }
    fgets(ch,len,stdin);
    //查找字符串中是否包含'\n'
    char *p=strchr(ch,'\n');
    if(NULL != p)
    {
        *p='\0';
    }
    else
    {
        chidaodi;
    }
}

//注册
void myRegist(const char *path)
{
    usrList *list=mkList();
    loadInfoFromFile(path,list);
    char caUsrName[NAME_LEN]={'\0'};
    while(1)
    {
        system("clear");
        printf("请输入注册用的用户名(不超过32位):\n");
        getSTR(caUsrName,NAME_LEN);
        if(NULL!=findNodeByName(list,caUsrName))
        {
            printf("注册失败！-->用户名已存在!\n");
            printf("两秒后请重新输入用户名！\n");
            sleep(2);
            continue;
        }
        break;
    }
        char caUsrPwd[PWD_LEN]={'\0'};
        printf("请输入注册用的密码(不超过32位):\n");
        getSTR(caUsrPwd,PWD_LEN);
        //保存
        usrNode *node=mkNode();
        strcpy(node->usrName,caUsrName);
        strcpy(node->usrPwd,caUsrPwd);
        myInsert(list,node);
        saveListToFile(PATH_NAME,list);
        printf("恭喜你！注册成功！\n");
        huichejixu();
        releaseUsrList(NULL,list);
        loginSwitch();
}

//登录
usrNode *myLogin(const char *path)
{
    usrList *list=mkList();
    loadInfoFromFile(path,list);
    usrNode *node=NULL;
    if(NULL != list)
    {
        char caUsrName[NAME_LEN]={'\0'};
        qingping;
        printf("请输入用户名：\n");
        getSTR(caUsrName,NAME_LEN);
        node=findNodeByName(list,caUsrName);
        if (NULL == node)
        {
            printf("登录失败-->该用户名不存在!\n");
            huichejixu();
        }
        else
        {
            char caUsrPwd[PWD_LEN]={'\0'};
            int flag=0;
            while(flag<TIMES_PWD)
            {
                qingping;
                printf("请输入密码：\n");
                getPassword(caUsrPwd);
                if(strcmp(caUsrPwd,node->usrPwd) == 0)
                {
                    yanZhengMa();
                    printf("登录成功!\n");
                    sleep(1);
                    releaseUsrList(node,list);
                    return node;
                }
                else
                {
                    printf("登录失败-->密码错误！\n");
                    printf("请重新输入密码：\n");
                    sleep(2);
                    flag++;
                }
            }
            node = NULL;
        }
    }
    else
    {
        printf("参数有误...\n");
    }
    releaseUsrList(node,list);
    return node;
}

//验证码
void yanZhengMa()
{
    char pstr[]="0123456789QWERTYUIOPASDFGHJKLZXCVBNMmnbvcxzlkjhgfdsaqwertyuiop";
    char a[5]={'\0'};
    char b[5]={'\0'};
    while(1)
    {
        srand(time(0));
        a[0]=pstr[rand()%10];
        a[1]=pstr[rand()%26+10];
        a[2]=pstr[rand()%26+36];
        a[3]=pstr[rand()%62];
        a[4]='\0';
        qingping;
        printf("验证码为：%s\n",a);
        printf("请输入验证码：\n");
        scanf("%s",b);
        if(strcmp(a,b) != 0)
        {
            printf("输入的验证码有误，两秒后请重新输入!\n");
            sleep(2);
            continue;
        }
        break;
    }
}

//登录进入对应界面
void switchByLogin()
{
    usrNode *usrLoginNode=myLogin(PATH_NAME);
    if(NULL == usrLoginNode)
    {
        loginSwitch();
        free(usrLoginNode);
    }
    else if(strcmp(usrLoginNode->usrName,"admin") == 0)
    {
        switchByAdmin();
        free(usrLoginNode);
    }
    else if (strcmp(usrLoginNode->usrName,"worker") == 0)
    {
        switchByWorker();
        free(usrLoginNode);
    }
    else
    {
        switchByPlayer(usrLoginNode);
        free(usrLoginNode);
    }
    
    
}

//开始进入对应界面
void loginSwitch()
{
    int iChoo=logOrRegFace();
    switch (iChoo)
    {
    case 1:
        switchByLogin();
        break;
    case 2:
        myRegist(PATH_NAME);
        break;
    
    default:
        break;
    }
}

//回车继续
void huichejixu()
{
    printf("请输入回车继续\n");
    chidaodi;
}

//检测键位
int getch()  
{  
    int c=0;
    struct termios org_opts, new_opts;
    int res=0;
    res=tcgetattr(STDIN_FILENO, &org_opts);
    assert(res==0);
    memcpy(&new_opts, &org_opts, sizeof(new_opts));
    new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | NOFLSH | TOSTOP | ICRNL);
    tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
    c=getchar();
    res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);
    assert(res==0);
    return c;
}

//输入密码，星号覆盖
void getPassword(char *pcPWD)
{
    int ch=0;
    int i=0;
    for(i=0;i<20;)
    {
        ch=getch();
        if(ch==-1)//当无键入时，跳出当前循环继续下一个循环
        {
            continue;
        }
        //127在键盘上是delete  8代表退格键backspace
        if((ch == 127 || ch == 8) && i>0)//当有键入时，按键delete或backspace时，删除一位
        {
            putchar('\b');	//这里是删除一个，通过输出回撤符 /b，回撤一格，
            putchar(' ');	//再显示空格符把刚才的*给盖住，
            putchar('\b');	//然后再 回撤一格等待录入。
            i--;			//减少一位
        }
        //10在键盘上代表换行(LF)，13代表回车(CR)
        //3.在不同平台，输入回车，getch()将返回不同数值，而getchar()统一返回10(即\n)
        //1)windows平台下ENTER键会产生两个转义字符 \r\n，因此getch返回13(\r)。
        //2)unix、 linux系统中ENTER键只产生 \n ，因此getch返回10(\n)。
        //3)MAC OS中ENTER键将产生 \r ，因此getch返回13(\r)。
        else if(ch==10 || ch == 13)//当键入的为换行时
        {
            pcPWD[i]='\0';//将字符串以'\0'结尾
            putchar('\n');
            return;
        }
        else if(i==0&&(ch==127 ||ch == 8))//当无键入时，按键delete或backspace时，产生警报
        {
            printf("\a");
        }
        else if(i<PWD_LEN)//当键入的数少于19位时每键入一个数打印一个星号覆盖
        {
            pcPWD[i]=(char)ch;
            putchar('*');
            i++;
        }
        else//当键入的数超过19位时，再次键入产生响铃
        {
            printf("\a");//响铃
        }
    }
}